package com.algomypractice.array;

/**
 * 1) 数组的插入、删除、按照下标随机访问操作；
 * 2）数组中的数据是int类型的；
 * <p>
 * 不支持动态扩容
 *
 * @author: ZhouBert
 * @date: 2019/6/3
 * @description:
 */
public class Array {

	/**
	 * 定义整型数据data保存数据
	 */
	private int[] data;
	/**
	 * 定义数组长度(作用-判断越界)
	 */
	private int n;
	/**
	 * 定义的实际长度
	 */
	private int count;

	/**
	 * 构造方法，定义数组大小
	 *
	 * @param capacity 数组的大小
	 */
	public Array(int capacity) {
		if (capacity < 0) {
			System.err.println("数组长度不能为0！");
			return;
		}
		data = new int[capacity];
		n = capacity;
		//在定义时，没有实际元素
		count = 0;
	}

	/**
	 * 根据索引，找到数据中的元素并返回
	 */
	public int find(int index) {
		if (index > count - 1) {
			System.err.println("索引大于已经存在的数组！");
			return -1;
		}
		return data[index];
	}

	/**
	 * 插入元素:头部插入，尾部插入
	 *
	 * @param index 插入索引的位置
	 * @param value 插入的数值
	 * @return
	 */
	public boolean insert(int index, int value) {
		if (index < 0 || index > count) {
			System.err.println("索引不合法！");
			return false;
		}
		if (count == n) {
			System.err.println("无可插入位置！");
			return false;
		}
		///位置合法
		for (int i = count; i > index; i--) {
			data[i] = data[i - 1];
		}
		data[index] = value;
		count++;
		return true;
	}

	/**
	 * 根据索引，删除数组中元素
	 *
	 * @param index
	 * @return
	 */
	public boolean delete(int index) {
		if (index < 0 || index >= count) {
			System.err.println("索引不合法！");
			return false;
		}
		//用这一种方式，对于最后的索引，不会进行删除
		for (int i = index + 1; i < count; i++) {
			data[i] = data[i - 1];
		}
		count--;
		return true;
	}

	/**
	 * 打印
	 */
	public void printAll() {
		for (int i = 0; i < count; i++) {
			System.out.print(data[i] + " ");
		}
		System.out.println();
	}

	public static void main(String[] args) {
		Array array = new Array(4);
		array.printAll();
		array.insert(0, 3);
		array.insert(0, 4);
		array.insert(1, 5);
		array.insert(3, 9);
		array.insert(3, 10);
		array.printAll();
		array.delete(3);
		//array.insert(3, 11);
		array.printAll();
	}

}
